package pe.gob.foncodes.ssa.bs.seguridad.service.impl;

import java.util.ArrayList;
import java.util.List;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.common.service.impl.GenericServiceImpl;
import pe.gob.foncodes.ssa.bs.seguridad.dao.UsuarioDao;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Accion;
import pe.gob.foncodes.ssa.bs.seguridad.domain.HorarioPerfil;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Modulo;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Opcion;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Usuario;
import pe.gob.foncodes.ssa.bs.seguridad.domain.UsuarioPerfil;
import pe.gob.foncodes.ssa.bs.seguridad.service.UsuarioService;

public class UsuarioServiceImpl extends GenericServiceImpl implements UsuarioService {
    
    private UsuarioDao usuarioDAO;

    public UsuarioDao getUsuarioDAO() {
        return usuarioDAO;
    }

    public void setUsuarioDAO(UsuarioDao usuarioDAO) {
        this.usuarioDAO = usuarioDAO;
    }

    @Override
    public List<Opcion> getFirstLevelNodes(Long idUsuario, List<UsuarioPerfil> usuarioPerfilList) throws ServiceException {
        List<Opcion> lista = null;
        List<Long> idsUsuarioPerfilList = null;
        try {
            idsUsuarioPerfilList = new ArrayList();
            for (UsuarioPerfil up : usuarioPerfilList) {
                idsUsuarioPerfilList.add(up.getId());
            }
            if(!idsUsuarioPerfilList.isEmpty()){
                lista = getUsuarioDAO().getFirstLevelNodes(idUsuario, idsUsuarioPerfilList);
            }else{
                lista = new ArrayList<Opcion>();
            }
        } catch (Exception e) {
            log.error("Error en getFirstLevelNodes:"+e.getMessage());
        }
        return lista;
    }
    
    @Override
    public List<Opcion> getFirstLevelNodes(Long idUsuario, Long idModulo, String codZonal) throws ServiceException {
        List<Opcion> lista = null;
        try {
            lista = getUsuarioDAO().getFirstLevelNodes(idUsuario, idModulo, codZonal);            
        } catch (Exception e) {
            log.error("Error en getFirstLevelNodes:"+e.getMessage());
        }
        return lista;
    }
    
    @Override
    public List<Accion> getOtherLevelNodes(Long idNodeSup, Long idUsuario, List<UsuarioPerfil> usuarioPerfilList, String codZonal) throws ServiceException{
        List<Accion> lista = null;
        List<Long> idsUsuarioPerfilList = null;
        try {
            idsUsuarioPerfilList = new ArrayList();
            for (UsuarioPerfil up : usuarioPerfilList) {
                idsUsuarioPerfilList.add(up.getId());
            }
            lista = getUsuarioDAO().getOtherLevelNodes(idNodeSup, idUsuario, idsUsuarioPerfilList, codZonal);
        } catch (Exception e) {
            log.error("Error en getOtherLevelNodes:"+e.getMessage());
        }
        return lista;
    }
    
    @Override
    public List<Accion> getOtherLevelNodes(Long idNodeSup, Long idUsuario, String codZonal) throws ServiceException{
        List<Accion> lista = null;
        try {
            lista = getUsuarioDAO().getOtherLevelNodes(idNodeSup, idUsuario, codZonal);
        } catch (Exception e) {
            log.error("Error en getOtherLevelNodes:"+e.getMessage());
        }
        return lista;
    }

    @Override
    public String retornaClaveEncriptada(String txtClave, String codUsuario) throws ServiceException {
        String enc_clave="";
        try {
            return getUsuarioDAO().retornaClaveEncriptada(txtClave, codUsuario);
        } catch (Exception e) {
            log.error("Error en retornaClaveEncriptada:"+e.getMessage());
        }
        return enc_clave;
    }

    @Override
    public List<HorarioPerfil> retornaHorarioPorPerfiles(List<UsuarioPerfil> usuarioPerfilList, String estado) throws ServiceException {
        List<HorarioPerfil> lista = null;
        List<Long> idsUsuarioPerfilList = null;
        try {
            idsUsuarioPerfilList = new ArrayList();
            for (UsuarioPerfil up : usuarioPerfilList) {
                if(up.getFlgHorarioRestringido().equals(estado)){
                    idsUsuarioPerfilList.add(up.getId());
                }
            }
            if(!idsUsuarioPerfilList.isEmpty()){
                lista = getUsuarioDAO().retornaHorarioPorPerfiles(idsUsuarioPerfilList, estado);
            }else{
                lista = new ArrayList<HorarioPerfil>();
            }
        } catch (Exception e) {
            log.error("Error en retornaHorarioPorPerfiles:"+e.getMessage());
        }
        return lista;
    }
    
    @Override
    public List<Usuario> getUsuarioByUnidadTerritorialZonalUsuario(String codZonal, String codUnidad, String codUsuario) throws ServiceException{
        List<Usuario> lista = new ArrayList<Usuario>();
        try{
            lista= getUsuarioDAO().getUsuarioByUnidadTerritorialZonalUsuario(codZonal, codUnidad, codUsuario);
        }catch(Exception e){
            e.printStackTrace();
            log.error("Error en getUsuarioByUnidadTerritorialZonalUsuario: "+e.getMessage());
        }
        return lista;
    }

    @Override
    public Modulo getModuloPadre(Long nidModulo) throws ServiceException {
        Modulo modulo=null;
        try {
            modulo = getUsuarioDAO().getModuloPadre(nidModulo);
        } catch (Exception e) {
            log.error("Error en getModuloPadre: "+e.getMessage());
        }
        return modulo;
    }
}
